package com.jlcloud.core.tenant;

import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.delete.Delete;
import net.sf.jsqlparser.statement.insert.Insert;
import net.sf.jsqlparser.statement.select.PlainSelect;
import net.sf.jsqlparser.statement.update.Update;
import com.jlcloud.core.secure.utils.AuthUtil;
import com.jlcloud.core.tool.utils.CollectionUtil;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 租户拦截器
 *
 * @author By: JlCloud <br>
 * @Package: com.jlcloud <br>
 * @CreateTime: 2024-12-03 21:45 <br>
 * @Copyright: 2021 www.jilianjituan.com Inc. All rights reserved. <br>
 * @Caution 注意：本内容仅限于冀联人力集团内部传阅，禁止外泄以及用于其他的商业目的 <br>
 */
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class JlCloudTenantInterceptor extends JlCloudTenantInnerInterceptor {

	/**
	 * 租户配置文件
	 */
	private JlCloudTenantProperties tenantProperties;
	/**
	 * 超管需要启用租户过滤的表
	 */
	private List<String> adminTenantTables = Arrays.asList("jlcloud_top_menu", "jlcloud_dict_biz");

	@Override
	public void setTenantLineHandler(TenantLineHandler tenantLineHandler) {
		super.setTenantLineHandler(tenantLineHandler);
	}

	/**
	 * select 条件处理
	 */
	@Override
	protected void processPlainSelect(final PlainSelect plainSelect, final String whereSegment) {
		// 判断 mainTable 进行条件追加
		List<Table> mainTables = super.processMainTables(plainSelect, whereSegment);
		if (CollectionUtils.isNotEmpty(mainTables) && !doTenantFilters(mainTables)) {
			super.processPlainSelect(plainSelect, whereSegment);
		}
	}

	/**
	 * insert 条件处理
	 */
	@Override
	protected void processInsert(Insert insert, int index, String sql, Object obj) {
		// 官方已支持租户ID自定义设置，无需再定义租户增强功能
		super.processInsert(insert, index, sql, obj);
	}

	/**
	 * update 条件处理
	 */
	@Override
	protected void processUpdate(Update update, int index, String sql, Object obj) {
		final Table table = update.getTable();
		if (doTenantFilter(table.getName())) {
			// 过滤退出执行
			return;
		}
		super.processUpdate(update, index, sql, obj);
	}

	/**
	 * delete 条件处理
	 */
	@Override
	protected void processDelete(Delete delete, int index, String sql, Object obj) {
		final Table table = delete.getTable();
		if (doTenantFilter(table.getName())) {
			// 过滤退出执行
			return;
		}
		super.processDelete(delete, index, sql, obj);
	}

	/**
	 * 判断当前操作是否需要进行过滤
	 *
	 * @param tableName 表名
	 */
	public boolean doTenantFilter(String tableName) {
		return AuthUtil.isAdministrator() && tenantProperties.getEnhance() && !adminTenantTables.contains(tableName);
	}

	/**
	 * 判断当前操作是否需要进行过滤
	 *
	 * @param tables 表名
	 */
	public boolean doTenantFilters(List<Table> tables) {
		List<String> tableNames = tables.stream().map(Table::getName).collect(Collectors.toList());
		return AuthUtil.isAdministrator() && tenantProperties.getEnhance() && !CollectionUtil.containsAny(adminTenantTables, tableNames);
	}

}
